<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        function Cat(name) {
            this.name = name;
        }

        // 继承的第一种实现方式：原型链继承
        // 把say方法放到Tom的原型对象中
        Cat.prototype.say = function() {
            console.log("汪汪汪");
        }

        // 问题
        Cat.prototype.eat = function() {}
        Cat.prototype.have = function() {}
        Cat.prototype.sleep = function() {}
        Cat.prototype.hello = function() {}
        Cat.prototype.shit = function() {}

        // 通过上面的方式，给Cat的原型对象添加了好多方法
        // 也就让Tom拥有了好多方法，但是产生了不少代码冗余

        // 为了减少这种重复，改良版
        // 替换已有的原型对象
        Cat.prototype = {
            constructor: Cat,
            f1: function() {},
            f2: function() {},
            f3: function() {},
            f4: function() {},
            f5: function() {}
        }

        var tom = new Cat("Tom");
        // 由于Cat.prototype被新的原型对象替换，所以访问不到原来的say方法
        console.log(tom.say) // undefined
        console.log(tom.f1)
    </script>
</body>
</html>